package org.wenhua.yuan.uisuite;

import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.res.Configuration;
import android.util.DisplayMetrics;

import org.jetbrains.annotations.NotNull;

/**
 * @describe  在 Activity#onCreate 方法中调用。
 * 关于第三方UI框架适配问题：可尝试使用字节码插桩的方式在所有的Activity#onCreate方法中插入
 * [提示] 这套方案对老项目不太友好，因为修改了系统的density值之后，
 * 整个布局的实际尺寸都会发生改变，如果想要在老项目文件中使用，恐怕整个布局文件中的尺寸都可能要重新按照设计稿修改。
 *
 * 因此，如果在维护或者改造老项目，可使用另一套适配方案 —— smallestWidth适配，或者叫sw限定符适配。
 * 指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值（其实就是手机的宽度值），
 * 然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
 *
 */
public class UISuiteDensityTool {

//    private UISuiteDensityTool() {}
//    public static UISuiteDensityTool getInstance(){
//        return CustomDensityToolHolder.sInstance;
//    }
//    private static class CustomDensityToolHolder {
//        private static final UISuiteDensityTool sInstance = new UISuiteDensityTool();
//    }

    private static float sNoncomptDensity;
    private static float sNoncomptScaleDensity;

    /**
     * 假设设计图宽度是360dp，以宽维度来适配.
     * 适配后的 density = 设备真实宽(单位px) / 360
     * [提示]设计人员常使用苹果6s作为设计稿原型。我们可大概估认为当前设计图使用的是375pt = 375dp
     * @param activity
     * @param application
     */
    private static void setCustomDensity(@NotNull Activity activity, @NotNull final Application application) {
        final DisplayMetrics appDisplayMetircs = application.getResources().getDisplayMetrics();

        if (sNoncomptDensity == 0) {
            sNoncomptDensity = appDisplayMetircs.density;
            sNoncomptScaleDensity = appDisplayMetircs.scaledDensity;
            // Application#registerComponentCallbacks 注册 onConfigurationChanged 监听系统设置中切换字体
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig != null && newConfig.fontScale > 0) {
                        sNoncomptScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }
        // 计算出在360dp设计稿下，当前手机屏幕的density
        // 即：设计稿宽360dp，要保证在所有设备计算得出的px值都正好是屏幕宽度的话，修改 density 的值即可。
        final float targetDensity = appDisplayMetircs.widthPixels / 360f;
        // 通过计算之前scaledDensity和density的比获得当前的scaledDensity（targetScaleDensity）
        final float targetScaleDensity = targetDensity * (sNoncomptScaleDensity / sNoncomptDensity);
        final int targetDensityDpi = (int) (160 * targetDensity);

        appDisplayMetircs.density = targetDensity;
        appDisplayMetircs.scaledDensity = targetScaleDensity;
        appDisplayMetircs.densityDpi = targetDensityDpi;

        final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaleDensity;
        activityDisplayMetrics.densityDpi = targetDensityDpi;
    }

}
